package com.lis.scf.common.dto;

import lombok.Data;
import org.springframework.data.domain.Page;

import java.io.Serializable;
import java.util.List;

/**
 * 分页结果DTO
 * 用于封装分页查询的结果，统一分页响应格式
 * @param <T> 分页数据的类型
 */
@Data
public class PageResultDTO<T> implements Serializable {

    /**
     * 当前页码（从1开始）
     */
    private Integer pageNum;

    /**
     * 每页显示条数
     */
    private Integer pageSize;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 总页数
     */
    private Integer pages;

    /**
     * 当前页的数据列表
     */
    private List<T> list;

    /**
     * 构建分页结果DTO
     * @param pageNum 当前页码
     * @param pageSize 每页条数
     * @param total 总记录数
     * @param list 数据列表
     */
    public PageResultDTO(Integer pageNum, Integer pageSize, Long total, List<T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
        // 计算总页数（向上取整）
        this.pages = total == 0 ? 0 : (int) (total + pageSize - 1) / pageSize;
    }

    /**
     * 从Spring Data JPA的Page对象转换为PageResultDTO
     * @param page JPA查询返回的Page对象
     * @param <T> 数据类型
     * @return 分页结果DTO
     */
    public static <T> PageResultDTO<T> from(Page<T> page) {
        return new PageResultDTO<>(
                page.getNumber() + 1, // JPA的pageNumber从0开始，这里转换为从1开始
                page.getSize(),
                page.getTotalElements(),
                page.getContent()
        );
    }

    /**
     * 构建空分页结果
     * @param pageNum 当前页码
     * @param pageSize 每页条数
     * @param <T> 数据类型
     * @return 空分页结果
     */
//    public static <T> PageResultDTO<T> empty(Integer pageNum, Integer pageSize) {
//        return new PageResultDTO<>(pageNum, pageSize, 0L, List);
//    }
}
